package com.yc.demo.ui;

import java.io.InputStream;

public class PushboxGame {
	
	// 将map转成全局变量
	int[][] map;
	// 移动监听器
	MoveListener moveListener;
	
	public int[][] getMap(int level) {
//		int[][] map = new int[20][20];
		map = new int[20][20];
		try(InputStream in = PushboxGame.class.getResourceAsStream(
				"/com/yc/demo/ui/map/" + level + ".map");){
			for (int i = 0; i < 20; i++) {
				for (int j = 0; j < 20; j++) {
					int num = in.read();
					System.out.print(num - 48);
					map[i][j] = num - 48;
				}
				in.read(); // 读掉回车
				in.read(); // 读掉换行
				System.out.println();
			}
		} catch (Exception e) {
			throw new RuntimeException("加载地图失败!", e);
		}
		return map;
	}
	
	public void up() {
		// 找到小人
		int x=0,y=0;
		a: for (int i = 0; i < map.length; i++) {
			for (int j = 0; j < map[i].length; j++) {
				if(map[i][j] >=5 && map[i][j]<=8) {
					x = j;
					y = i;
					break a;  // 退出命名循环
				}
			}
		}
		
		// 判断小人是否可以移动  TODO 表示有问完成代码
		
		// 移动小人
		int y2 = y - 1;
		int value2 = 8;
		// 相当于当前产生了一个事件, 移动事件
		moveListener.moved(new MoveEvent(x, y, map[y][x], x, y2, value2));
		map[y2][x] = value2;
		
		// 还原小人之前位置的图片
		moveListener.moved(new MoveEvent(x, y, map[y][x], x, y, 2));
		map[y][x] = 2;
	}
	
	public void down() {
		// 找到小人
		int x=0,y=0;
		a: for (int i = 0; i < map.length; i++) {
			for (int j = 0; j < map[i].length; j++) {
				if(map[i][j] >=5 && map[i][j]<=8) {
					x = j;
					y = i;
					break a;  // 退出命名循环
				}
			}
		}
		
		// 判断小人是否可以移动  TODO 表示有问完成代码
		
		// 移动小人
		int y2 = y + 1;
		int value2 = 5;
		// 相当于当前产生了一个事件, 移动事件
		moveListener.moved(new MoveEvent(x, y, map[y][x], x, y2, value2));
		map[y2][x] = value2;
		
		// 还原小人之前位置的图片
		moveListener.moved(new MoveEvent(x, y, map[y][x], x, y, 2));
		map[y][x] = 2;
	}
	
	public void left() {
		// 找到小人
		int x=0,y=0;
		a: for (int i = 0; i < map.length; i++) {
			for (int j = 0; j < map[i].length; j++) {
				if(map[i][j] >=5 && map[i][j]<=8) {
					x = j;
					y = i;
					break a;  // 退出命名循环
				}
			}
		}
		
		// 判断小人是否可以移动  TODO 表示有问完成代码
		
		// 移动小人
		int x2 = x - 1;
		int value2 = 6;
		// 相当于当前产生了一个事件, 移动事件
		moveListener.moved(new MoveEvent(x, y, map[y][x], x2, y, value2));
		map[y][x2] = value2;
		
		// 还原小人之前位置的图片
		moveListener.moved(new MoveEvent(x, y, map[y][x], x, y, 2));
		map[y][x] = 2;
	}
	
	public void right() {
		// 找到小人
		int x=0,y=0;
		a: for (int i = 0; i < map.length; i++) {
			for (int j = 0; j < map[i].length; j++) {
				if(map[i][j] >=5 && map[i][j]<=8) {
					x = j;
					y = i;
					break a;  // 退出命名循环
				}
			}
		}
		
		// 判断小人是否可以移动  TODO 表示有问完成代码
		
		// 移动小人
		int x2 = x + 1;
		int value2 = 7;
		// 相当于当前产生了一个事件, 移动事件
		moveListener.moved(new MoveEvent(x, y, map[y][x], x2, y, value2));
		map[y][x2] = value2;
		
		// 还原小人之前位置的图片
		moveListener.moved(new MoveEvent(x, y, map[y][x], x, y, 2));
		map[y][x] = 2;
	}
	
	// 观察者模式
	public void addMoveListener(MoveListener moveListener) {
		this.moveListener = moveListener;
	}
	
	public static void main(String[] args) {
		PushboxGame game = new PushboxGame();
		game.getMap(1);
	}
	
	
}



class MoveEvent {
	int x1;
	int y1;
	int value1;
	
	int x2;
	int y2;
	int value2;
	public MoveEvent(int x1, int y1, int value1, int x2, int y2, int value2) {
		super();
		this.x1 = x1;
		this.y1 = y1;
		this.value1 = value1;
		this.x2 = x2;
		this.y2 = y2;
		this.value2 = value2;
	}
}

interface MoveListener{
	void moved(MoveEvent e);
}














